package conservare.negocio;

import java.util.Date;
import java.util.List;

import conservare.dao.ContratoDAO;
import conservare.modelo.contrato.Contrato;
import conservare.modelo.type.Mes;
import conservare.modelo.type.SituacaoContrato;

public class ContratoRN {
	
	private ContratoDAO dao;
	
	public ContratoRN(){
		this.dao = new ContratoDAO();
	}
	
	public Contrato getById(Integer id){
		return this.dao.getById(id);
	}
	
	public Contrato salvar(Contrato contrato){
		
		if(contrato.getContratante().getId() == null){
			new PessoaRN().salvar(contrato.getContratante());
		}
		
		if(contrato.getId() == null){
			contrato.adicionarResponsavelPeloLocalPrestacaoServico(contrato.getContratante());
		}
		
		if(contrato.getResponsavelLocalPrestacaoServico() != null && contrato.getResponsavelLocalPrestacaoServico().getId() == null){
			new PessoaRN().salvar(contrato.getResponsavelLocalPrestacaoServico());
		}
		
		if(contrato.getLocalPrestacaoServico().getId() == null){
			
			new LocalPrestacaoServicoRN().salvar(contrato.getLocalPrestacaoServico());
			
		}
		
		Contrato retorno  = this.dao.salvar(contrato);
		
		return getById(retorno.getId());
		
	}
	
	public List<Contrato> getTodos(){
		return this.dao.getTodos();
	}
	
	public List<Contrato> getContratosDisponiveisParaLancamentoNoMes(Integer anoRef, Mes mesRef){
		
		if(anoRef == null || mesRef == null){
			return null;
		}
		
		return dao.getContratosDisponiveisParaLancamentoNoMes(anoRef, mesRef);
		
	}
	
	public List<Contrato> getContratosAtivos(){
		return dao.getContratosAtivos();
	}
	
	public Contrato criarNovoContrato(){
		Contrato novoContrato = new Contrato();
		novoContrato.setContratante(new PessoaRN().getNovo());
		novoContrato.setLocalPrestacaoServico(new LocalPrestacaoServicoRN().getNovoLocal());
		return novoContrato;
	}
	
/*	public List<Contrato> getTodosComExcecaoDestes(List<Contrato> contratosParaSeremDesconsiderados){
		return this.dao.getTodosComExcecaoDestes(contratosParaSeremDesconsiderados);
	}*/
	
/*	public Contrato getNovo(TipoLocalPrestacaoServico tipoLocalPrestacaoServico){
		Contrato novoContrato = new Contrato();
		novoContrato.adicionaLocalPrestacaoServico(new LocalPrestacaoServicoRN().getNovoLocalPrestacaoServico(tipoLocalPrestacaoServico));
		novoContrato.setResponsavelContratoAtual(new PessoaRN().getNovo());
		
		return novoContrato;
	}*/
	
/*	public void adicionarServicoLimpezaConservacao(ServicoLimpezaConservacao_____________ limpezaConservacao ){
		
		this.dao.adicionarServicoLimpezaConservacao(limpezaConservacao);
		
	}*/
	
	public void cancelarContrato(Contrato contrato, String motivoCancelamentoContrato){
		if(contrato.getSituacao().equals(SituacaoContrato.EM_PROCESSO)){
			contrato.setSituacao(SituacaoContrato.CANCELADO);
			contrato.setDataCancelamento(new Date());
			contrato.setMotivoFimContrato(motivoCancelamentoContrato);
			salvar(contrato);
		}
	}
	
	public void ativarContrato(Contrato contrato){
		contrato.setSituacao(SituacaoContrato.ATIVO);
		salvar(contrato);
	}
	
	public void finalizarPrestacaoServioDoContrato(Contrato contrato, Date dataFimVigenciaContrato, String motivo){
		if(contrato.getSituacao().equals(SituacaoContrato.ATIVO)){
			contrato.setSituacao(SituacaoContrato.DESCONTINUADO);
			contrato.setDataFimVigencia(dataFimVigenciaContrato);
			contrato.setMotivoFimContrato(motivo);
			salvar(contrato);
		}
	}
	
}
